package xmu.crms.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;
import xmu.crms.entity.*;
import xmu.crms.exception.ClassesNotFoundException;
import xmu.crms.exception.CourseNotFoundException;
import xmu.crms.exception.SeminarNotFoundException;
import xmu.crms.exception.UserNotFoundException;

import java.math.BigInteger;
import java.util.List;

/**
 * @author hxr
 */

@Component
@Mapper
public interface ClassMapper {

    /**
     * 根据班级id删除选课记录.
     * @param classId
     * @return
     */
    Boolean deleteClassSelectionByClassId(BigInteger classId);

    /**
     * 根据教师名称找到教师id.
     * @param teacherName
     * @return
     */
    User findTeacherIdByteacherName(String teacherName);

    /**
     * 根据教师id和课程名称找到课程id.
     * @param teacherId
     * @param courseName
     * @return
     */
    Course findCourseIdByteacherIdAndCourseName(@Param("teacherId") BigInteger teacherId, @Param("courseName") String courseName);

    /**
     * 根据课程id找到班级列表.
     * @param courseId
     * @return
     */
    List<ClassInfo> findClassByCourseId(BigInteger courseId);

    /**
     * 根据班级id找到班级.
     * @param classId
     * @return
     */
    ClassInfo findClassByClassId(BigInteger classId);

    /**
     * 根据班级id更新班级信息.
     * @param newClass
     * @return
     */
    Boolean updateClassByClassId(ClassInfo newClass);

    /**
     * 根据班级id删除班级信息.
     * @param classId
     * @return
     */
    Boolean deleteClassByClassId(BigInteger classId);

    /**
     * 新增选课记录.
     * @param courseSelection
     * @return
     */
    Integer insertCourseSelectionById(CourseSelection courseSelection);

    /**
     * 根据学生id找到学生.
     * @param studentId
     * @return
     */
    User findStudentdByStudentId(BigInteger studentId);

    /**
     * 根据教师id找到教师.
     * @param teacherId
     * @return
     */
    User findTeacherByTeacherId(BigInteger teacherId);

    /**
     * 根据课程id找到课程.
     * @param courseId
     * @return
     */
    Course findCourseByCourseId(BigInteger courseId);

    /**
     * 根据用户id和班级id找到课程id.
     * @param userId
     * @param classId
     * @return
     */
    BigInteger findCourseIdByUserIdAndClassId(@Param("userId") BigInteger userId, @Param("classId") BigInteger classId);

    /**
     * 根据用户id和班级id删除选课记录.
     * @param userId
     * @param classId
     * @return
     */
    Boolean deleteCourseSelectionById(@Param("userId") BigInteger userId, @Param("classId") BigInteger classId);

    /**
     * 根据班级id讨论课id获取班级签到状态.
     * @param classId
     * @param seminarId
     * @return
     */
    Location getCallStatusById(@Param("classId") BigInteger classId, @Param("seminarId") BigInteger seminarId);

    /**
     * 根据讨论课id找到讨论课.
     * @param semiarId
     * @return
     */
    Seminar findSeminarById(BigInteger semiarId);

    /**
     * 新增班级.
     * @param classInfo
     * @return
     */
    Integer insertClassById(ClassInfo classInfo);

    /**
     * 根据课程id删除该课程下所有班级.
     * @param courseId
     */
    void deleteClassByCourseId(BigInteger courseId);


    /**
     * 根据班级id删除评分规则.
     * @param classId
     */
    void deleteScoreRuleById(BigInteger classId);

    /**
     * 柑橘班级id获取评分规则.
     * @param classId
     * @return
     */
    ClassInfo getScoreRule(BigInteger classId);

    /**
     * 插入评分规则.
     * @param classInfo
     * @return
     */
    Integer insertScoreRule(ClassInfo classInfo);

    /**
     * 开始签到.
     * @param location
     * @return
     */
    Integer callInRollById(Location location);

    /**
     * 根据用户id获取该用户所有课程选课记录.
     * @param userId
     * @return
     */
    List<CourseSelection> findClassByUserId(BigInteger userId);

    /**
     * 结束签到.
     * @param location
     */
    void endCallRollById(Location location);

    /**
     * 根据班级id删除该班级下所有选课记录.
     * @param classId
     */
    void deleteCoueseSelectionByClassId(BigInteger classId);

    /**
     * 根据课程id列出该课程下所有班级信息列表.
     * @param course
     * @return
     */
    List<ClassInfo> listClassByCourseId(Course course);
}
